﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace MakeIT.Deo.Negocios
{
    /// <summary>
    /// Classe que reune os métodos relativos ao Contato - Herda da classe base NegocioBase
    /// </summary>
    public class ContatoBO
    {

        private deoEntities modelo = null;

        public ContatoBO()
        {
            modelo = new deoEntities();
        }

        /// <summary>
        /// Salva um novo registro ou atualiza um já existente
        /// </summary>
        /// <param name="entidade">Objeto a ser gravado/atualizadao em banco de dados</param>
        /// <param name="novo">Determina se um novo registro ou não</param>
        public void SalvarContato(contato entidade, Boolean novo)
        {
            try
            {

                // Verifica se eh um registro novo
                if (novo)
                {
                    // Insere o regisro na tabela de Contato
                    modelo.AddTocontato(entidade);
                }
                else
                {
                    //Efetiva as mudanças na entidade já existente
                    modelo.ApplyPropertyChanges(entidade.EntityKey.EntitySetName, entidade);
                }

                // Efetiva a trasação no Banco
                modelo.SaveChanges();
                
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        /// <summary>
        /// Recupera uma lista de Contato 
        /// </summary>
        /// <param name="idContato">Codigo do Contato</param>
        /// <param name="nomeContato">Nome do contato usado no filtro da query (like)</param>
        /// <returns>Lista de Contato</returns>
        public List<contato> RecuperaContato(int? idContato, string nomeContato, string email, string assunto, DateTime? dtIni, DateTime? dtFin)
        {

            try
            {
                // Declara objetos
                IQueryable<contato> query = modelo.contato;

                // Verifica se o código do contato é diferente de nulo
                if (idContato != null)
                {
                    // monta query dinamica
                    query = query.Where(a => a.idcontato == idContato);
                }

                // Verifica se filtro nomeContato é diferente de vazio ou nulo
                if (!string.IsNullOrEmpty(nomeContato))
                {
                    // monta query dinamica
                    query = query.Where(a => a.nome.Contains(nomeContato));
                }


                // Verifica se filtro email é diferente de vazio ou nulo
                if (!string.IsNullOrEmpty(email))
                {
                    // monta query dinamica
                    query = query.Where(a => a.email.Contains(email));
                }

                // Verifica se filtro email é diferente de vazio ou nulo
                if (!string.IsNullOrEmpty(assunto))
                {
                    // monta query dinamica
                    query = query.Where(a => a.assunto.Contains(assunto));
                }

                if (dtIni != null && dtFin != null)
                {
                    query = query.Where(a => a.envio >= dtIni.Value && a.envio <= dtFin.Value);
                }
                else if (dtIni != null)
                {
                    query = query.Where(a => a.envio >= dtIni.Value);
                }
                else if (dtFin != null)
                {
                    query = query.Where(a => a.envio <= dtFin.Value);
                }


                // Executa Query
                var retornaLista = from clien in query
                                   orderby clien.envio descending
                                   select clien;

                if (retornaLista.Count() > 0)
                {
                    return retornaLista.ToList();
                }
                else
                {
                    return null;
                }

            }
            catch (Exception e)
            {

                throw e; //TODO: Tratar a exceção
            }
        }

        /// <summary>
        /// Recupera o Contato pelo código.
        /// </summary>
        /// <param name="idContato">Código do Contato</param>
        /// <returns>Lista de contato</returns>
        public contato RecuperaContato(int? idContato)
        {
            List<contato> listaContato = RecuperaContato(idContato, null, null, null, null, null);
            if (listaContato!=null && listaContato.Count>0)
                return listaContato[0];
            else
                return null;
        }

        /// <summary>
        /// Recupera o Contato pelo nome (like)
        /// </summary>
        /// <param name="nomeContato">Nome do Contato</param>
        /// <returns>Lista de contatos</returns>
        public List<contato> RecuperaContato(string nomeContato)
        {
            return RecuperaContato(null, nomeContato, null, null, null, null);
        }

        /// <summary>
        /// Recupera todos os registros Contato
        /// </summary>        
        /// <returns>Lista de Contatos</returns>
        public List<contato> RecuperaContato()
        {
            // chama o método de mesmo nome (overload) passando apenas o parametro pertinente
            return this.RecuperaContato(null, null, null, null, null, null);
        }

        /// <summary>
        /// Excluir um determinado registro 
        /// </summary>
        /// <param name="entidade">Registro a ser excluido</param>
        /// <param name="msg"></param>
        /// <returns>Retorna uma msg quando há, a qual sinaliza algum fluxo alternativo</returns>
        public void DeletaContato(contato contato)
        {
            try
            {
                
                EntityKey key = new EntityKey(modelo.DefaultContainerName + ".contato", "idcontato", contato.idcontato);
                modelo.DeleteObject(modelo.GetObjectByKey(key));
                modelo.SaveChanges();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

    }

}
